package ecomp.poli.milla;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import javax.imageio.ImageIO;

public class LerBase {

	
	public static int getClasse(int i)
	{
		
		String caminhoBase = "C:\\Users\\MIRIAN\\Documents\\IC\\jaffe_crop_tratado\\";
								
		File diretorio = new File(caminhoBase); 
		File fList[] = diretorio.listFiles();
		
		String nomeImagem = fList[i].getName();
		
		nomeImagem = nomeImagem.substring(3,5);
		
		int classe =0;
		if(nomeImagem.equals("DI"))//desgosto
			classe = 0;
		else if (nomeImagem.equals("FE"))//medo
			classe = 1;
		else if (nomeImagem.equals("HA"))//alegria
			classe = 2;
		else if (nomeImagem.equals("NE"))//neutro
			classe = 3;
		else if (nomeImagem.equals("SA"))//tristeza
			classe = 4;
		else if (nomeImagem.equals("SU"))//surpresa
			classe = 5;
		else if (nomeImagem.equals("AN"))//raiva
			classe = 6;
		
		return classe;
			
		
		

	}
	
	/*
	
	public static int getQuantClasses(int classe)
	{
		File diretorio = new File(caminhoBase); 
		File fList[] = diretorio.listFiles();
		
		for(int i=0;i<213;i++)
		{
			LerBase.getClasse(i);
		
		}
		
		for(int i=0;i<quantidadeImagens;i++)
		{
			
		}
		
	}
	*/
	
	public double[] lerBase(String caminho)
	{
		double[] vetorImagem = new double[1];
		
		try {
			BufferedImage image = ImageIO.read(new File(caminho));
			 vetorImagem = new double[image.getWidth()*image.getHeight()];
			
			int i=0;
			
			for(int x=0;x<image.getWidth();x++)
				for(int y=0;y<image.getHeight();y++){
					Color c = new Color(image.getRGB(x,y));
					double valor = (double)c.getRed() / 255;
					vetorImagem[i] = valor;
					i++;
				}
					
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println(caminho);
			e.printStackTrace();
		}
		
		
		return vetorImagem;
	}
	
	public double[] lerJaffeTeste()
	{
		return lerBase("C:\\Users\\MIRIAN\\Documents\\IC\\jaffe_crop_tratado\\KA.SU3.38.bmp");
	}
	
	public double[][] lerJaffeTreino()
	{
		String caminhoBase = "C:\\Users\\MIRIAN\\Documents\\IC\\jaffe_crop_tratado\\";
		
		double[][] features = new double[212][1600];
		
		
	
		File diretorio = new File(caminhoBase); 
		File fList[] = diretorio.listFiles(); 
		 

		for ( int i = 0; i < fList.length-1; i++ ){
			features[i] = lerBase(fList[i].getAbsolutePath());
		 
		} 
		
		
		return features;
		
	
	}
	
	
	public void shuffle(String expressao)	
	{
		String caminhoBase = "C:\\Users\\MIRIAN\\Documents\\IC\\BASEJAFFE\\"+expressao+"\\";
		File diretorio = new File(caminhoBase); 
		File fList[] = diretorio.listFiles();
		ArrayList posicoes = new ArrayList();
				
			
		
		for(int i=0;i<fList.length;i++)
			posicoes.add(i);
		
		ArrayList novasPosicoes = new ArrayList();
		
		Random random = new Random();
		int posicaoVisitada;
		
		while(novasPosicoes.size() < fList.length)
		{
			 posicaoVisitada= random.nextInt(posicoes.size());
			novasPosicoes.add(posicoes.get(posicaoVisitada));
		    posicoes.remove(posicaoVisitada);										
		}
	
		for(int i=0;i<fList.length;i++)
		{
			String nome =  fList[i].getName();
						
			while(nome.charAt(0) < 57)
				nome = nome.substring(1);
			
			fList[i].renameTo(new File(fList[i].getAbsolutePath().replace(fList[i].getName(), novasPosicoes.get(i)+nome)));
		}
		
		
	
	}
	
	
	public ArrayList<double[][]> lerBaseExpressao(double[][] baseTreino, double[][]  baseTeste, String expressao){
	
		String caminhoBase = "C:\\Users\\MIRIAN\\Documents\\IC\\BASEJAFFE\\"+expressao+"\\";
		ArrayList<double[][]> resultado = new ArrayList<double[][]>();
		
		shuffle(expressao);
		baseTreino = new double[20][1600];
		//baseTeste = new double[193][1600];
		
		
		int uy=0;
		int kr=0;
		int tm=0; 
		int ka=0;
		int mk=0;
		int kl=0;
		int nm=0;
		int na=0;
		int ym=0;
		int km=0;
		
		
		File diretorio = new File(caminhoBase); 
		File[] fList = diretorio.listFiles(new FilenameFilter() {
			public boolean accept(File dir, String name) {
			return name.toLowerCase().endsWith(".bmp");
			}
			});
		//System.out.println(fList.length);
		baseTeste = new double[fList.length-baseTreino.length][1600];
		//System.out.println(baseTeste.length);
		
		int a=0;
		int b=0;
		
		for ( int i = 0; i < fList.length; i++ ){
			//if(!fList[i].getName().contains(".db")) {
			//System.out.println(fList[i].getName());
				if(fList[i].getName().contains("UY") && uy < 2)
			{
				baseTreino[a] = lerBase(fList[i].getAbsolutePath());
				uy++;
				a++;
			}
			else if(uy >=2 && fList[i].getName().contains("UY"))
			{	
				baseTeste[b] = lerBase(fList[i].getAbsolutePath());
				b++;
			}
		    if(fList[i].getName().contains("KR") && kr < 2)
			{
				baseTreino[a] = lerBase(fList[i].getAbsolutePath());
				kr++;
				a++;
			}
		    else if(kr >=2 && fList[i].getName().contains("KR"))
		    {	
		    	baseTeste[b] = lerBase(fList[i].getAbsolutePath());
				b++;
		    }
		    if(fList[i].getName().contains("TM") && tm < 2)
			{
				baseTreino[a] = lerBase(fList[i].getAbsolutePath());
				tm++;
				a++;
			}
		    else if(tm >=2 && fList[i].getName().contains("TM"))
		    {	
		    	baseTeste[b] = lerBase(fList[i].getAbsolutePath());
				b++;
		    }
		    if(fList[i].getName().contains("KA") && ka < 2)
			{
				baseTreino[a] = lerBase(fList[i].getAbsolutePath());
				ka++;
				a++;
			}
			else if(ka >=2 && fList[i].getName().contains("KA"))
			{	
				baseTeste[b] = lerBase(fList[i].getAbsolutePath());
				b++;
			}
		    if(fList[i].getName().contains("MK") && mk < 2)
			{
				baseTreino[a] = lerBase(fList[i].getAbsolutePath());
				mk++;
				a++;
			}
			else if(mk >=2 && fList[i].getName().contains("MK"))
			{	
				baseTeste[b] = lerBase(fList[i].getAbsolutePath());
				b++;
			}
		    if(fList[i].getName().contains("KL") && kl < 2)
			{
				baseTreino[a] = lerBase(fList[i].getAbsolutePath());
				kl++;
				a++;
			}
			else if(kl >=2 && fList[i].getName().contains("KL"))
			{	
				baseTeste[b] = lerBase(fList[i].getAbsolutePath());
				b++;
			}
		    if(fList[i].getName().contains("NM") && nm < 2)
			{
				baseTreino[a] = lerBase(fList[i].getAbsolutePath());
				nm++;
				a++;
			}
			else if(nm >=2 && fList[i].getName().contains("NM"))
			{	
				baseTeste[b] = lerBase(fList[i].getAbsolutePath());
				b++;
			}
		    if(fList[i].getName().contains("NA") && na < 2)
			{
				baseTreino[a] = lerBase(fList[i].getAbsolutePath());
				na++;
				a++;
			}
			else if(na >=2 && fList[i].getName().contains("NA"))
			{	
				baseTeste[b] = lerBase(fList[i].getAbsolutePath());
				b++;
			}
		    if(fList[i].getName().contains("YM") && ym < 2)
			{
				baseTreino[a] = lerBase(fList[i].getAbsolutePath());
				ym++;
				a++;
			}
			else if(ym >=2 && fList[i].getName().contains("YM"))
			{	
				baseTeste[b] = lerBase(fList[i].getAbsolutePath());
				b++;
			}
		    if(fList[i].getName().contains("KM") && km < 2)
			{	
				baseTreino[a] = lerBase(fList[i].getAbsolutePath());
				km++;
				a++;
			}
			else if(km >=2 && fList[i].getName().contains("KM"))
			{	
				baseTeste[b] = lerBase(fList[i].getAbsolutePath());
				b++;
			}
		   
			
		}
		
		
		resultado.add(baseTreino);
		resultado.add(baseTeste);
		//System.out.println(baseTeste.length);
		//System.out.println(baseTreino.length);
		return resultado;
		
	}
	
	
	
}
